/**
 * 实现一个通用MyReadonly2<T, K>，它带有两种类型的参数T和K。
 *
 * K指定应设置为Readonly的T的属性集。如果未提供K，则应使所有属性都变为只读，就像普通的Readonly<T>一样。
 *
 * 例如
 */
interface TodoReadonly {
  title: string
  description: string
  completed: boolean
}

type MyReadonly2<T,K extends keyof T = keyof T>={
  readonly[P in K]:T[P]
}& Omit<T, K>
// 首先要约束K,属于T的.如果没有设置,默认值就是 keyof T
// 然后在补上 剩余的属性. omit<T,k>

const todoReadonly: MyReadonly2<TodoReadonly, 'title' | 'description'> = {
  title: "Hey",
  description: "foobar",
  completed: false,
}

// todoReadonly.title = "Hello" // Error: cannot reassign a readonly property
// todoReadonly.description = "barFoo" // Error: cannot reassign a readonly property
todoReadonly.completed = true // OK
